from django.shortcuts import render

# Create your views here.
from rest_framework.response import Response
from rest_framework.views import APIView
from urllib.parse import urlencode, parse_qs
from urllib.request import urlopen

from oauth.models import OAuthQQUser
from rest_framework_jwt.settings import api_settings

from apps.oauth.utils import QQOauth
from mall import settings
from .serializers import OauthQQSerializer


class QQOauthURLView(APIView):
    """
    实现返回 登录扫描的url
    生成auth_url
    https://graph.qq.com/oauth2.0/authorize
    请求参数请包含如下内容：
    response_type   必须      授权类型，此值固定为“code”。
    client_id       必须      申请QQ登录成功后，分配给应用的appid。
    redirect_uri    必须      成功授权后的回调地址，必须是注册appid时填写的主域名下的地址，建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
    state           必须      client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
    scope           可选      scope=get_user_info
    """
    def get(self, request):

        qq = QQOauth()

        auth_url = qq.get_url()

        return Response({'auth_url': auth_url})


class QQOauthCreateView(APIView):
    """
    根据返回的code生成token
    """
    # /oauth/qq/users
    def get(self, request):
        # 获取code
        code = request.query_params.get('code')

        if code is None:
            return Response(status=400)

        qq = QQOauth()

        # 通过code获取token
        access_token = qq.get_token(code)

        openid = qq.get_openid(access_token)

        # 我们需要通过openID来进行判断
        # 如果openid已经在数据库中，说明已经绑定过，直接返回登录的token
        # 如果没有在数据库中，说明是第一次绑定，然后跳转到绑定页面

        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 如果没有在数据库中，说明是第一次绑定，然后跳转到绑定页面

            # 需要把openid应该作为一个参数传递过去
            # return Response({'openid': openid})
            # 因为openid非常重要，所以需要对openid进行处理

            token = OAuthQQUser.genericte_open_id_token(openid)

            return Response({'access_token': token})

        else:
            # 如果openid已经在数据库中，说明已经绑定过，直接返回登录的token
            # 生成已登录的token
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            user = qquser.user

            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)

            response = Response({
                'token': token,
                'user_id': user.id,
                'username': user.username
            })

            return response

    def post(self, request):
        """
        当用户提交的时候 把手机号,密码,短信验证码,和 access_token(openid) 提交给后台
        后台对 短信验证码进行验证, 在验证 access_token , 验证token之后可以提前到openid
        把入库
        """
        # 创建序列化器
        serializer = OauthQQSerializer(data=request.data)

        # 进行校验
        serializer.is_valid(raise_exception=True)

        # 数据保存
        user = serializer.save()

        # 返回登录的token
        # 生成已登录的token
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)

        response = Response({
            'token': token,
            'user_id': user.id,
            'username': user.username
        })

        return response

from itsdangerous import TimedJSONWebSignatureSerializer as S

#初始化对象
#第一个参数是 screct
# 第二个是时间
s = S('123',3600)

#第二步,将关键数据进行处理
dict = {
    'userid':1,
    'username':'itheima'
}

token = s.dumps(dict)


# 校验
s.loads(token)

#有效期的问题
#初始化对象
#第一个参数是 screct
# 第二个是时间
s = S('123',1)

#第二步,将关键数据进行处理
dict = {
    'userid':1,
    'username':'itheima'
}

token = s.dumps(dict)


# 校验
s.loads(token)




